﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DNA
{
    public partial class tree : Form
    {
        public bool first_row = true;
        public int coll = 0;
        public string[,] way_atr;
        public int help_way_atr = 0;//указатель на массив движения в дереве
        public int[] what_we_use = new int[50];//массив, в котором уже использованные атрибуты
        public int help_what_we_use = 0;//указатель для массива использованных атрибутов
        public  int help_in_table = 0;//указатель на таблицу построения отчёта
        public int anti_chikl = 100500;
        bool use_statistik = false;
        public int min_yarv;
        public float min_korrel;
        public decimal znach;
        public int count_yrav = 0;
        bool we_buit_corel = false;
        int help_in_tab = 0;
        int _Y;
        public decimal VEROIATNOST;

        public tree()
        {
            InitializeComponent();
            DNA dna = this.Owner as DNA;
        }

        public void fill_atr()
        {
            Y.Items.Clear();
            check_atr.Items.Clear();

            DNA dna = this.Owner as DNA;
             for (int i =0; i< dna.TDNA.Columns.Count; i++)
             {
                 Y.Items.Add(dna.TDNA.Columns[i].HeaderText);
                 check_atr.Items.Add(dna.TDNA.Columns[i].HeaderText);
                 check_atr.SetItemChecked(i, true);
             }
             eq_count.Maximum = dna.TDNA.Rows.Count-1;
             eq_count.Value = eq_count.Maximum;
        }

        public void fill_user_atr()//подготавливаем форму для ввода пользовательских данных
        {
            
      /*      DataGridViewColumn atr = new DataGridViewTextBoxColumn();
            atr.HeaderText = "Атрибут";
            set_value.Columns.Add(atr);
            DataGridViewColumn znach = new DataGridViewTextBoxColumn();
            znach.HeaderText = "Значение";
            set_value.Columns.Add(znach);
            int j = 0;
            for (int i = 0; i < check_atr.Items.Count; i++)
            {
                if (check_atr.GetItemChecked(i) == true)
                {
                    set_value.Rows.Add();
                    set_value[0, j].Value = check_atr.Items[i].ToString();
                    j++;
                }
            }*/
        }

        private void start_tree_Click(object sender, EventArgs e)//нажатие кнопки Начала построения
        {
            if (use_statistik != true)
            {
                fill_data();
            }
            fill_user_atr();
            if (tree_corel.Checked == true)
            {
                we_buit_corel = true;
            }
            else we_buit_corel = false;
            Coral_tree();
           
        }

    
        private void Coral_tree()//начало заполнения и проведения дерева по корреляционным данным
        {
            _Y = find_me_y();
            set_value.Columns.Clear();
            DataGridViewColumn atr = new DataGridViewTextBoxColumn();
            atr.HeaderText = "Атрибут";
            set_value.Columns.Add(atr);
            DataGridViewColumn znach = new DataGridViewTextBoxColumn();
            znach.HeaderText = "Значение";
            set_value.Columns.Add(znach);
            way_atr = new string[40, 3];
            min_yarv = Convert.ToInt32(min_yrav_corel.Value);
            DataGridViewColumn ctpo4ka = new DataGridViewTextBoxColumn();
            ctpo4ka.HeaderText = "Цепочка уравнения";
            help_data.Columns.Add(ctpo4ka);
            DataGridViewColumn veroat = new DataGridViewTextBoxColumn();
            veroat.HeaderText = "Вероятность";
            help_data.Columns.Add(veroat);
            DataGridViewColumn from = new DataGridViewTextBoxColumn();
            from.HeaderText = "Из ветки";
            help_data.Columns.Add(from);
            DataGridViewColumn status = new DataGridViewTextBoxColumn();
            status.HeaderText = "Положение в дереве";
            help_data.Columns.Add(status);
            DataGridViewColumn proekt = new DataGridViewTextBoxColumn();
            proekt.HeaderText = "Выделенные значения";
            help_data.Columns.Add(proekt);
            show_progress.Value = 0;
            //show_progress.Maximum = data.Columns.Count-1;
            regres_for_tree reg = new regres_for_tree();
            reg.Owner = this;
            int koren =  reg.new_main_koren(Y.SelectedItem.ToString());
            {
                    help_data.Rows.Add();
                    help_data[0, help_in_table].Value = data.Columns[koren].HeaderText;
                    help_data[2, help_in_table].Value = "-";
                    help_data[3, help_in_table].Value = "корень";
                    help_data[4, help_in_table].Value = Count_way(koren, true,false);
                    way_atr[help_way_atr, 0] = koren.ToString();
                    report.Text = report.Text + '\n' +"Новый корень: " + data.Columns[koren].HeaderText + '\n'+ "Дальнейшие пути разибиения: " + way_atr[help_way_atr, 1] + '|' + way_atr[help_way_atr, 2] + '\n';
                    what_we_use[help_what_we_use] = koren;//добавляем корень в список уже использованных атрибутов
                    help_what_we_use++;
                    set_value.Rows.Add(data.Columns[koren].HeaderText,way_atr[help_way_atr,1] + " | " + way_atr[help_way_atr,2]);
                    help_way_atr++;
                    help_in_table++;
                    help_data[1, help_in_table-1].Value = veroiatnost(koren).ToString();
                    report.Text = report.Text + '\n' + "Новый корень: " + data.Columns[koren].HeaderText + '\n' + "Вероятность: "+ help_data[1,help_in_table-1].Value.ToString() + '\n' +"Дальнейшие пути разибиения: " + way_atr[help_way_atr-1, 1] + '|' + way_atr[help_way_atr-1, 2] + '\n';
                    build_tree(koren);//переходим к дальнейшему построению дерева 
                    
                }
                for (int i = 0; i < help_what_we_use; i++)
                {
                    what_we_use[i] = 150;
                }
                help_what_we_use = 0;
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    {
                        for (int stolbech = 0; stolbech < data.Columns.Count; stolbech++)
                            data[stolbech, i].Style.BackColor = Color.White;
                }
                   
            }
        }

        private void build_tree(int nah_koren)
        {
            bool user_fill = false;
            int nah_new_yzel=0;
            goto again;
            int help;
            string report_tree;
            decimal veroat;
        again:
            {
                if (we_buit_corel == true) nah_new_yzel = new_yzel(nah_koren);//опеределяем следующий узел
                else nah_new_yzel = new_yzel_standart(nah_koren);
                if (nah_new_yzel < anti_chikl)
                {
                    what_we_use[help_what_we_use] = nah_new_yzel;//заносим его в список использованных
                    help_what_we_use++;
                    Count_way(nah_new_yzel, false, false);//расчитываем возможности дальнейшего разбиения
                    help_way_atr++;
                    if (proverka_yzla_na_list(nah_new_yzel) != true)//проверяем, не конец ли это
                    {//если нет, то заносим дан5ные в таблицу и повторяем данный алгоритм...тем самым, мы всегда двигаемся влево
                        help_data.Rows.Add();
                        report_tree = "";
                        for (int i = 0; i <= help_way_atr-1; i++)
                        {
                            help = Convert.ToInt32(way_atr[i, 0]);
                            report_tree = report_tree + " " + data.Columns[help].HeaderText;
                        }
                        help_data[0, help_in_table].Value = report_tree;
                        veroat = veroiatnost(nah_new_yzel);
                        help_data[1, help_in_table].Value = veroat.ToString();
                        help_data[2, help_in_table].Value = way_atr[help_way_atr - 2, 1];
                        help_data[3, help_in_table].Value = "узел";
                        help_data[4, help_in_table].Value = way_atr[help_way_atr - 1, 1] + " || " + way_atr[help_way_atr - 1, 2];
                        for (int ro = 0; ro < set_value.Rows.Count-1; ro++)
                        {
                            if (data.Columns[nah_new_yzel].HeaderText == Convert.ToString(set_value[0, ro].Value))
                            { 
                               if (way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2] == Convert.ToString(set_value[1, ro].Value)) break;
                               else
                               {
                                   set_value[1, ro].Value = Convert.ToString(set_value[1, ro].Value) + " | " + way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2];
                                   user_fill = true;
                                   break;
                               }
                            }
                            user_fill = false;
                        }
                        if (user_fill == false)
                        {
                            if (way_atr[help_way_atr - 1, 2] == "#") set_value.Rows.Add(data.Columns[nah_new_yzel].HeaderText, way_atr[help_way_atr - 1, 1]);
                            else set_value.Rows.Add(data.Columns[nah_new_yzel].HeaderText, way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2]);
                        }
                        user_fill = false;
                        help_in_table++;
                        report.Text = report.Text + "Новый узел: " + data.Columns[nah_new_yzel].HeaderText + '\n' + "Путь: " + help_data[0, help_in_table - 1].Value + "->" + way_atr[(help_way_atr - 2), 1] + '\n' + "Значение корреляции c его предком: " + znach.ToString() + '\n';
                        report.Text = report.Text + "Колличество уравнений: " + count_yrav.ToString() + '\n' + "Вероятность: " + help_data[1, help_in_table - 1].Value.ToString() + '\n' + "Дальнейшие пути разибиения: " + way_atr[(help_way_atr - 1), 1] + '|' + way_atr[(help_way_atr - 1), 2] + '\n';
                        nah_koren = nah_new_yzel;
                        goto again;
                    }
                    else
                    {
                        help_data.Rows.Add();
                        report_tree = "";
                        for (int i = 0; i <= help_way_atr-1; i++)
                        {
                            help = Convert.ToInt32(way_atr[i, 0]);
                            report_tree = report_tree + " " + data.Columns[help].HeaderText;
                        }
                        help_data[0, help_in_table].Value = report_tree;
                        veroat = veroiatnost(nah_new_yzel) ;
                        help_data[1, help_in_table].Value = veroat.ToString();
                        help_data[2, help_in_table].Value = way_atr[help_way_atr - 2, 1];
                        help_data[3, help_in_table].Value = "лист";
                        // help_data[4, help_in_table].Value = way_atr[help_way_atr - 1, 1] + " || " + way_atr[help_way_atr - 1, 2];
                        for (int ro = 0; ro < set_value.Rows.Count - 1; ro++)
                        {
                            if (data.Columns[nah_new_yzel].HeaderText == Convert.ToString(set_value[0, ro].Value))
                            {
                                if (way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2] == Convert.ToString(set_value[1, ro].Value)) break;
                                else
                                {
                                    set_value[1, ro].Value = Convert.ToString(set_value[1, ro].Value) + " | " + way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2];
                                    user_fill = true;
                                    break;
                                }
                            }
                            user_fill = false;
                        }
                        if (user_fill == false)
                        {
                            if (way_atr[help_way_atr - 1, 2] == "#") set_value.Rows.Add(data.Columns[nah_new_yzel].HeaderText, way_atr[help_way_atr - 1, 1]);
                            else set_value.Rows.Add(data.Columns[nah_new_yzel].HeaderText, way_atr[help_way_atr - 1, 1] + " | " + way_atr[help_way_atr - 1, 2]);
                        }
                        user_fill = false;
                        report.Text = report.Text + "Новый лист: " + data.Columns[nah_new_yzel].HeaderText + '\n' + "Путь: " + help_data[0, help_in_table - 1].Value + "->" + way_atr[(help_way_atr - 2), 1] + '\n' + "Вероятность: " + help_data[1, help_in_table - 1].Value.ToString() + '\n' + "Значение корреляции c его предком: " + znach.ToString() + '\n' + "Колличество уравнений: " + count_yrav.ToString() + '\n';
                        help_in_table++;
                        way_atr[help_way_atr - 1, 0] = null;
                        way_atr[help_way_atr - 1, 1] = null;
                        way_atr[help_way_atr - 1, 2] = null;
                        help_way_atr--;
                        goto List;
                    }

                }
                else goto List;
            }
            List:
                {
                    if (nah_new_yzel == anti_chikl) help_data[3, help_in_table-1].Value = "лист";
                if (way_atr[help_way_atr - 1, 2] != "#")
                    {
                        way_atr[help_way_atr - 1, 1] = way_atr[help_way_atr - 1, 2];
                        way_atr[help_way_atr - 1, 2] = "#";
                        nah_koren = Convert.ToInt32(way_atr[help_way_atr - 1, 0]);
                      
                        goto again;
                    }
                    else
                    {
                        way_atr[help_way_atr-1, 0] = null;
                        way_atr[help_way_atr-1, 1] = null;
                        way_atr[help_way_atr-1, 2] = null;
                        help_way_atr--;
                        if (help_way_atr == 1)
                        {
                            while (help_what_we_use != 2)
                            {
                                what_we_use[help_what_we_use - 1] = 150;
                                help_what_we_use--;
                            }
                           if (help_data[3, help_in_table - 1].Value.ToString() == "узел")
                           { help_data[3, help_in_table - 1].Value = "лист"; }
                        }
                        if (help_way_atr == 0) { }//goto Break;}
                        else goto List;
                    }
                }
                //Break: { }
            }

       private bool proverka_yzla_na_list(int koren)//проверяем, не лист ли у нас получился...лист - когда в узле не более 5 уравнений
        {
            bool answer = false;
            count_yrav = 0;
            bool firrst = true;
            for (int whu = 0; whu <= help_way_atr-1; whu++)
                {
                    if (firrst == true)
                    {
                        pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, true, false);
                        firrst = false;
                    }
                    else pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, false, false);
               }
            for (int row = 0; row < data.Rows.Count; row++)
            {
                if (data[koren, row].Style.BackColor == Color.Yellow)
                {
                    count_yrav++;
                }
            }
            if (count_yrav <= min_yarv) answer = true;
            pokraska(0, 0, false, true);
            return answer;
        }

        public bool if_we_use_twice(int verhina)//проверям, не использовали мы данный атрибут раньше
        {
            bool answ = false; 
            for (int i = 0; i < help_what_we_use; i++)
            {
                if (what_we_use[i] == verhina)
                {
                    answ = true;
                    break;
                }
            }
            return answ;
        }

       private int new_yzel_standart(int koren)
        { 
          int new_koren=0;
          help_in_tab = 0;
          calcdata.Rows.Clear();
          int max1, max2,verh;
          bool cheng = false;
          for (int pretendent = 0; pretendent < data.Columns.Count; pretendent++)
          {
              if (data.Columns[pretendent].HeaderText == "Диагноз") continue;
              if (if_we_use_twice(pretendent) == true) continue;
              calcdata.Rows.Add();
              calcdata[0, help_in_tab].Value = pretendent;
              Count_way(pretendent, false, true);
              help_in_tab++;
          }
          
             // max1 = Convert.ToInt32(calcdata[1, 0].Value.ToString());
             // max2 = Convert.ToInt32(calcdata[2, 0].Value.ToString());
             // verh = Convert.ToInt32(calcdata[0, 0].Value.ToString());
              max1 = 1;
              max2 = 1;
              verh = 0;
              for (int row = 0; row < calcdata.Rows.Count - 1; row++)
              {
                  try
                  {
                      if ((max1 > Convert.ToInt32(calcdata[1, row].Value.ToString())) && (max2 > Convert.ToInt32(calcdata[2, row].Value.ToString()))) continue;
                      if (((max2 * max1) > (Convert.ToInt32(calcdata[1, row].Value.ToString()) * Convert.ToInt32(calcdata[2, row].Value.ToString()))) && (Convert.ToInt32(calcdata[1, row].Value.ToString()) / max1 < 2) && (Convert.ToInt32(calcdata[2, row].Value.ToString()) / max2 < 2)) continue;
                      if ((Convert.ToInt32(calcdata[1, row].Value.ToString()) / max1 < 2) && (Convert.ToInt32(calcdata[2, row].Value.ToString()) / max2 < 2)) continue;
                      // if ((max1 < (int)calcdata[1, row].Value) && (max2 < (int)calcdata[2, row].Value))
                      // { 

                      // }
                      max1 = Convert.ToInt32(calcdata[1, row].Value.ToString());
                      max2 = Convert.ToInt32(calcdata[2, row].Value.ToString());
                      verh = Convert.ToInt32(calcdata[0, row].Value.ToString());
                      cheng = true;
                  }
                  catch
                  {
                      continue;
                  }
              }
              if (cheng == true)
              {
                  new_koren = verh;
                  way_atr[help_way_atr, 0] = new_koren.ToString();
                  
              }
              else new_koren = anti_chikl; 
            return new_koren;
        }
        
        private int new_yzel (int koren)//находим новый узел (определяем следующий рассматриваемый атрибут)
        {
            int atr=0;
            string att = "";
            int stet4ik=0;
            decimal korel=0;
            decimal niz_gran;
            niz_gran = Convert.ToDecimal(corel_niz.SelectedItem);
            for (int row = 0; row < calc_data.Rows.Count-1;row++)
            {
                if (calc_data[0, row].Value.ToString() == koren.ToString())
                {
                    stet4ik = row + 1;
                    att = calc_data[1, row].Value.ToString();
                    try
                    {
                        korel = Convert.ToDecimal(calc_data[2, row].Value.ToString());
                    }
                    catch
                    { continue; }
                  try
                   {
                    while (calc_data[0, stet4ik].Value.ToString() == koren.ToString())
                    {
                       
                            if ((Convert.ToDecimal(calc_data[2, stet4ik].Value.ToString())) > korel)
                            {
                                if ((if_we_use_twice(Convert.ToInt32(calc_data[1, stet4ik].Value.ToString()))) == true)  //чтобы не использовали атрибут дважды
                                {
                                    stet4ik++;
                                    if (stet4ik > (calc_data.Rows.Count - 1)) goto Move_forvard;
                                    else continue;
                                }
                                atr = Convert.ToInt32(calc_data[1, stet4ik].Value.ToString());
                                korel = Convert.ToDecimal(calc_data[2, stet4ik].Value.ToString());
                                stet4ik++;
                                if (stet4ik > (calc_data.Rows.Count - 1)) goto Move_forvard;
                            }
                            else
                            {
                                stet4ik++;
                                if (stet4ik > (calc_data.Rows.Count - 1)) goto Move_forvard;
                            }
                        }
                  }
                     catch
                        {
                            goto Move_forvard;
                        }
                    
                    break;
                }
                else 
                { if (stet4ik++ > (calc_data.Rows.Count - 1)) goto Move_forvard; }
            }
            goto Move_forvard;
            Move_forvard:
            if (atr == 0)
            {
                atr = anti_chikl;
                return Convert.ToInt32(atr);
            }
            znach = korel;

                if (znach <= niz_gran)
                {
                    atr = anti_chikl;
                    help_data[3, help_in_table-1].Value = "лист";
                    return Convert.ToInt32(atr);
                }
                else
                {
                    way_atr[help_way_atr, 0] = atr.ToString();//заносим новый узел в массив движения в дереве
                    return Convert.ToInt32(atr);
                }
        }


       private void pokraska(int koren,int way__atr, bool first,bool all_white)
        {
            if (first == true)
            {
                for (int i = 0; i < Convert.ToInt32(eq_count.Value); i++)
                {
                    if (Convert.ToString(data[koren, i].Value) == way_atr[way__atr, 1])
                    {
                        for (int stolbech = 0; stolbech < data.Columns.Count; stolbech++)
                            data[stolbech, i].Style.BackColor = Color.Yellow;
                    }
                }
             }
            if (first == false)
            {
                for (int i = 0; i < Convert.ToInt32(eq_count.Value); i++)
                {
                    if (Convert.ToString(data[koren, i].Value) == way_atr[way__atr, 1])
                    {
                        if (data[koren, i].Style.BackColor == Color.Yellow)
                            continue;
                    }
                    else
                    {
                        if (data[koren, i].Style.BackColor == Color.Yellow)
                        {
                            for (int stolbech = 0; stolbech < data.Columns.Count; stolbech++)
                            {
                                data[stolbech, i].Style.BackColor = Color.White;
                            }
                        }
                    }
                }
            }
            if (all_white == true)
            {
                for (int i = 0; i < Convert.ToInt32(eq_count.Value); i++)
                {
                    for (int j = 0; j < data.Columns.Count; j++)
                    {
                        data[j, i].Style.BackColor = Color.White;
                    }
                }
            }
          
        }

       private decimal veroiatnost(int koren_v)
       {
           decimal veroatnost=1;
           int chislitel =0;
           bool first = true;
           int ro = data.Rows.Count - 1;
           for (int whu = 0; whu <= help_way_atr - 1; whu++)
           {
               if (first == true)
               {
                   pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, true, false);
                   first = false;
                   for (int row = 0; row < data.Rows.Count; row++)
                   {
                       if (data[koren_v, row].Style.BackColor == Color.Yellow)
                       {
                           if (il.Checked == true)
                           {
                               if (Convert.ToString(data[_Y, row].Value) == "полож") chislitel++;
                           }
                           else
                           {
                               if (Convert.ToString(data[_Y, row].Value) == "отрицат") chislitel++;
                           }
                       }
                   }
                   veroatnost = ((decimal)chislitel / (decimal)ro);
                   chislitel = 0;
               }
               else
               {
                   pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, false, false);
                   for (int row = 0; row < data.Rows.Count; row++)
                   {
                       if (data[koren_v, row].Style.BackColor == Color.Yellow)
                       {
                           if (il.Checked == true)
                           {
                               if (Convert.ToString(data[_Y, row].Value) == "полож") chislitel++;
                           }
                           else
                           {
                               if (Convert.ToString(data[_Y, row].Value) == "отрицат") chislitel++;
                           }
                       }
                   }
                   veroatnost = veroatnost* (((decimal)chislitel / (decimal)ro));
                   chislitel = 0;
               }
           }
           pokraska(0, 0, false, true);
           return veroatnost;
       }

      private int find_me_y()
       {
           int _Y=0;
           for (int i = 0; i < data.Columns.Count; i++)
           {
               if (data.Columns[i].HeaderText == Y.SelectedItem.ToString()) { _Y = i; break; }
           }
           return _Y;
       }

       string Count_way(int who_koren, bool first, bool standart)
        { 
          string result="";
          int wa1=0;
          int wa2=0;
          int ya1 = 0;
          int ya2 = 0;
          bool flag = false;
          int help_count=0;
          string[,] count = new string[10, 2];
          bool firrst = true;
          if (first != true)
          {
              for (int whu = 0; whu < help_way_atr ; whu++)
              {
                  if (firrst == true)
                  {
                      pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, true, false);
                      firrst = false;
                  }
                  else pokraska((Convert.ToInt32(way_atr[whu, 0])), whu, false, false);
              }
          }
          for (int i = 0; i < Convert.ToInt32(eq_count.Value); i++)
          {
              if (Convert.ToString(data[who_koren, i].Value) == "") break;
              if (first != true) 
              {
                  if (data[who_koren, i].Style.BackColor != Color.Yellow) continue;
              }
 
              for (int j = 0; j < 10; j++)
              {
                  if (count[j, 0] == Convert.ToString(data[who_koren, i].Value))
                  {
                      help_count = Convert.ToInt32(count[j, 1]);
                     
                          help_count++;
                          count[j, 1] = help_count.ToString();
                          flag = true;//для того, чтобы у нас повторно значение атрибуты не было добавленно в массив
                          break;
                  }
              }
              if (flag != true)
              {
                  for (int j = 0; j < 10; j++)
                  {
                      help_count = 0;
                      if (count[j, 0] == null)
                      {
                       
                              count[j, 0] = Convert.ToString(data[who_koren, i].Value);
                              help_count++;
                              count[j, 1] = help_count.ToString();
                              break;
                          
                      }
                  }
              }
              flag = false;
          }
          for (int i = 0; i < 10; i++)
          {
              if (count[i, 0] != null)
              {
                  wa1++;
              }
              else break;
          }
          if (wa1 == 1)
          {
              result = count[0, 0] + " || " + "#";
              way_atr[help_way_atr, 1] = count[0, 0];
              way_atr[help_way_atr, 2] = "#";
              calcdata[1, help_in_tab].Value = count[0, 1];
              calcdata[2, help_in_tab].Value = 0;

          }
          if (wa1 == 2)
          {
              result = count[0, 0] + " || " + count[1, 0];
              way_atr[help_way_atr, 1] = count[0, 0];
              way_atr[help_way_atr, 2] = count[1, 0];
              calcdata[1, help_in_tab].Value = count[0, 1];
              calcdata[2, help_in_tab].Value = count[1, 1];
          }
          if (wa1 > 2)
          {
              wa1 = Convert.ToInt32(count[0, 1]);
              wa2 = 0;
              ya1 = Convert.ToInt32(count[0, 1]);
              ya1 = 0;
              for (int i = 1; i < 10; i++)
              {
                  if (wa1 < Convert.ToInt32(count[i, 1]))
                  {
                      wa1 = Convert.ToInt32(count[i,1]);
                      wa2 = i;
                  }
              }
              for (int i = 0; i < 10; i++)
              {
                  if (ya1 < Convert.ToInt32(count[i, 1]) && Convert.ToInt32(count[i, 1]) < wa1)
                  {
                      ya1 = Convert.ToInt32(count[i, 1]);
                      ya2 = i;
                  }
              }
              if (standart == true)
              {
                  calcdata[1, help_in_tab].Value = count[wa2, 1];
                  calcdata[2, help_in_tab].Value = count[ya2, 1];
              }
              else
              {
                  result = count[wa2, 0] + " || " + count[ya2, 0];
                  way_atr[help_way_atr, 1] = count[wa2, 0];
                  way_atr[help_way_atr, 2] = count[ya2, 0];
              }
          }
          pokraska(0, 0, false, true);
          return result;
        }


        public void help_fill(int col,bool main)
        {
            DNA dna = this.Owner as DNA;
            DataGridViewColumn newdata = new DataGridViewTextBoxColumn();
            newdata.HeaderText = dna.TDNA.Columns[col].HeaderText;
            data.Columns.Add(newdata);
            for (int y = 0; y < Convert.ToInt32(eq_count.Value); y++)
            {
                if (first_row == true)
                {
                    data.Rows.Add(dna.TDNA[coll, y].Value);
                    if (main == true)
                     {
                        data[coll,y].Style.BackColor = Color.Green;
                     }
                }
                data[coll, y].Value = dna.TDNA[col, y].Value;
            }
            first_row = false;
            coll++;
        }

        private void fill_data()
        {
            bool main = false;
           DNA dna = this.Owner as DNA;
            for (int i = 0; i < dna.TDNA.Columns.Count; i++)
           {
               if (check_atr.GetItemChecked(i) == true)
               {
                   help_fill(i,main);
               }
               else
               {
                   if (dna.TDNA.Columns[i].HeaderText == Y.SelectedItem.ToString())
                   {
                       main = true;
                       help_fill(i,main);
                       main = false;
                   }
               }
           }
        }

        private void all_clean_Click(object sender, EventArgs e)
        {
            coll = 0;
            help_way_atr = 0;
            help_what_we_use = 0;
            help_in_table = 0;
            count_yrav = 0;
            data.Columns.Clear();
            help_data.Columns.Clear();
            report.Clear();
            set_value.Columns.Clear();
            tree_corel.Checked = false;
            first_row = true;
        }

        private void cancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tree_corel_CheckedChanged(object sender, EventArgs e)
        {
            if (use_statistik != true)
            {
                obj_zak.Checked = false;
                verot_po_verhinam.Checked = false;
                obj_zak.Enabled = false;
                verot_po_verhinam.Enabled = false;
                use_statistik = true;
                label4.Visible = true;
                we_buit_corel = true;
                corel_niz.Visible = true;
                fill_data();
                tree_regress tre_reg = new tree_regress();
                tre_reg.Owner = this;
                tre_reg.calc_me_a_correl();
                for (int ro = 0; ro < calc_data.Rows.Count-1; ro++)
                {
                    try
                    {
                        if (Convert.ToDecimal(calc_data[2, ro].Value.ToString()) > 0) corel_niz.Items.Add(calc_data[2, ro].Value.ToString());
                    }
                    catch
                    { continue; }
                }
            }
            else
            {
                label4.Visible = false;
                corel_niz.Visible = false;
                obj_zak.Enabled = true;
                verot_po_verhinam.Enabled = true;
                use_statistik = false;
                we_buit_corel = false;
            }

        }

        private void report_DoubleClick(object sender, EventArgs e)
        {
            sad_more sad = new sad_more();
            sad.Owner = this;
            sad.rich();
            sad.Show();
        }

        private void say_me_Click(object sender, EventArgs e)
        {
            user_atr user = new user_atr();
            user.Owner = this;
            user.Coral_tree();
            string what;
            if (il.Checked == true) what = " заболеет ";
            else what = " будет здоров ";
            MessageBox.Show("По имеющимся данным, вероятность того, что больной "+ what + "равна " + VEROIATNOST.ToString());
        }

    }
}
